import { useEffect, useRef } from 'react';
import { useDidShow } from '@tarojs/taro';

type PageEvent = 'init' | 'didShow' | 'depsChange';

/**
 * 生命周期 Hook：
 * - 初始化阶段，只调用一次 'init'，避免 useEffect / useDidShow / depsChange 多次触发
 * - 页面出现触发 'didShow'
 * - 依赖变化触发 'depsChange'（但初始化阶段不触发）
 */
export function usePageEffect(
  callback: (event: PageEvent) => void,
  deps: any[] = [],
) {
  const hasCalledInit = useRef(false);
  const lastDepsRef = useRef<any[]>(deps);
  const triggeredInCycle = useRef(false);

  const isDepsEmpty = deps.length === 0;

  // 页面首次挂载
  useEffect(() => {
    callback('init');
    lastDepsRef.current = deps;
    triggeredInCycle.current = false; // 清一轮周期的触发状态
    hasCalledInit.current = true;
  }, []);

  // 页面展示（如果当前周期还没触发）
  useDidShow(() => {
    if (hasCalledInit.current) {
      callback('didShow');
      triggeredInCycle.current = true;
      // hasCalledInit.current = true;
    }
  });

  // 依赖变化（非空 + 初始化后）
  useEffect(() => {
    if (!isDepsEmpty && hasCalledInit.current) {
      const prevDeps = lastDepsRef.current;
      const changed = deps.some((dep, i) => dep !== prevDeps[i]);

      if (changed) {
        // 依赖变化时，无论 triggeredInCycle 状态如何都要触发
        callback('depsChange');
        triggeredInCycle.current = true;
        lastDepsRef.current = deps;
      }
    }

    // 清掉周期状态：等下一次 didShow 有机会执行
    const timer = setTimeout(() => {
      triggeredInCycle.current = false;
    }, 0);

    return () => clearTimeout(timer);
  }, deps);
}
